/**
 * @file   Documents.java
 * @author Enrique Madrid <e.madrid@lpcsite.com>
 * @date   Sat Jul 14 08:33:49 2007
 *
 * @brief  Implementa un Hashtable de Documentos
 *
 */

package sim.framework;

import java.util.*;

public class Documents {

    private static final int QUEUE_INIT_SIZE = 4;
    
    public Hashtable m_Hashtable;
    
    public Documents() {
        m_Hashtable = new Hashtable(QUEUE_INIT_SIZE);
    }
    
    private boolean isNull(Object obj) {
	if (obj != null) {
	    return obj.equals(this);
	}
	return true;
    }

    /**
     * Añade un documento.
     *
     * @param i Identificador del documento.
     * @param d Referencia a un objeto del tipo Document.
     *
     * @see delete()
     */
    public void append(int i, Document d) {
        m_Hashtable.put(new Integer(i), (Object) d);
    }
    
    /**
     * Burca un documento.
     *
     * @param i Identificador del documento.
     *
     * @return Si tiene éxito devuelve una referencia al documento,
     *         en caso contrario devuelve null.
     */
    public Document search(int i ) {
	Object obj;
	obj = m_Hashtable.get(new Integer(i));
        return ((Document)(isNull(obj) ? null : obj));
    }
    
    /**
     *  Extrae un documento.
     *
     * @param i Identificador del documento
     *
     * @return Si tiene Ă©xito devuelve una referencia al documento,
     *         en caso contrario devuelve null.
     *
     * @see search()
     */
    public Document remove( int i ) {
	Object obj;
	obj = m_Hashtable.remove(new Integer(i));
        return ((Document)(isNull(obj) ? null : obj));
    }
    
    /**
     * Cambia un documento.
     *
     * Si ya existe un documento con el mismo identificador, este es borrado.
     *
     * @param i Identificador del documento.
     * @param d Referencia a un objeto del tipo Document.
     *
     * @see delete()
     * @see append()
     */
    public void change(int i, Document d) {
	Object obj;
	if (d == null)
	    obj = this;
	else
	    obj = d;
	obj = m_Hashtable.put(new Integer(i), obj);
    }
    
    /**
     * Remplaza un documento para un identificador.
     *
     * El documento remplazado no es eliminado.
     *
     * @param i Identificador del documento.
     * @param d Referencia a un objeto del tipo Document.
     *
     * @return Referencia al objeto remplazado.
     *
     * @see remove()
     * @see append()
     */
    public Document attach(int i, Document d) {
        return (Document) m_Hashtable.put(new Integer(i), (Object) d);
    }
    
    
}
